/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * CadastroControlador.java
 *
 * Created on 19/12/2010, 11:51:28
 */
package br.ufrn.engcomp.pds.helloopc.visao;

import br.ufrn.engcomp.pds.helloopc.controle.CadastrarControladorController;
import br.ufrn.engcomp.pds.helloopc.controle.ICadastroController;
import br.ufrn.engcomp.pds.helloopc.modelo.dominio.Controlador;
import br.ufrn.engcomp.pds.helloopc.modelo.dominio.ParametroConfiguracao;
import br.ufrn.engcomp.pds.helloopc.modelo.dominio.TagOPC;
import br.ufrn.engcomp.pds.helloopc.modelo.dominio.VariavelControlador;
import br.ufrn.engcomp.pds.helloopc.visao.excecao.VisaoException;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Felipe Rivas
 */
public class CadastroControlador extends CadastroBase<Controlador> {

    private static final int COLUNA_ATUALIZAR_TABELA = 4;
    private static final int COLUNA_REMOVER_TABELA = 5;
    private static final int COLUNA_ATUALIZAR_TABELA_PARAMETRO = 2;
    private static final int COLUNA_REMOVER_TABELA_PARAMETRO = 3;
    private static final int COLUNA_ATUALIZAR_TABELA_VARIAVEL = 6;
    private static final int COLUNA_REMOVER_TABELA_VARIAVEL = 7;

    private CadastrarControladorController controller = new CadastrarControladorController();
    private Operacao operacaoAtualParametro;
    private ParametroConfiguracao entidadeParametro;
    private List<ParametroConfiguracao> parametros;
    private Operacao operacaoAtualVariavel;
    private VariavelControlador entidadeVariavel;
    private List<VariavelControlador> variaveis;

    /** Creates new form CadastroControlador */
    public CadastroControlador() {
        initComponents();

        preencherTabela();

        adicionarBotoesTabela();

        listarTagsOPC();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        janelaEdicao = new javax.swing.JDialog();
        jPanel3 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        txtNome = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        txtPeriodoAmostragem = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        txtValorEstadoSeguranca = new javax.swing.JTextField();
        jSeparator1 = new javax.swing.JSeparator();
        jScrollPane2 = new javax.swing.JScrollPane();
        tabelaParametro = new javax.swing.JTable();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        txtNomeParametro = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        txtValorParametro = new javax.swing.JTextField();
        btnOKParametro = new javax.swing.JButton();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        txtNomeVariavel = new javax.swing.JTextField();
        jLabel9 = new javax.swing.JLabel();
        txtLimiteMinimoVariavel = new javax.swing.JTextField();
        jLabel10 = new javax.swing.JLabel();
        txtLimiteMaximoVariavel = new javax.swing.JTextField();
        cmbTagOPCVariavel = new javax.swing.JComboBox();
        btnOKVariavel = new javax.swing.JButton();
        jScrollPane4 = new javax.swing.JScrollPane();
        tabelaVariavel = new javax.swing.JTable();
        btnOK = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        jLabel11 = new javax.swing.JLabel();
        jLabel12 = new javax.swing.JLabel();
        jLabel13 = new javax.swing.JLabel();
        txtUnidadeEngenhariaVariavel = new javax.swing.JTextField();
        txtEscalaConversaoVariavel = new javax.swing.JTextField();
        jLabel14 = new javax.swing.JLabel();
        txtArquivoAlgoritmo = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        fcArquivoAlgoritmo = new javax.swing.JFileChooser();
        jScrollPane1 = new javax.swing.JScrollPane();
        tabela = new javax.swing.JTable();
        jPanel1 = new javax.swing.JPanel();
        btnInserir = new javax.swing.JButton();

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(helloopc.HelloOPCApp.class).getContext().getResourceMap(CadastroControlador.class);
        janelaEdicao.setTitle(resourceMap.getString("janelaEdicao.title")); // NOI18N
        janelaEdicao.setBounds(new java.awt.Rectangle(50, 50, 0, 0));
        janelaEdicao.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        janelaEdicao.setModalityType(java.awt.Dialog.ModalityType.TOOLKIT_MODAL);
        janelaEdicao.setName("janelaEdicao"); // NOI18N
        janelaEdicao.setResizable(false);

        jPanel3.setName("jPanel3"); // NOI18N

        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        txtNome.setName("txtNome"); // NOI18N

        jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
        jLabel2.setName("jLabel2"); // NOI18N

        txtPeriodoAmostragem.setName("txtPeriodoAmostragem"); // NOI18N

        jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
        jLabel3.setName("jLabel3"); // NOI18N

        txtValorEstadoSeguranca.setName("txtValorEstadoSeguranca"); // NOI18N

        jSeparator1.setName("jSeparator1"); // NOI18N

        jScrollPane2.setName("jScrollPane2"); // NOI18N

        tabelaParametro.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Nome", "Valor", "Atualizar", "Remover"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, true, true
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tabelaParametro.setName("tabelaParametro"); // NOI18N
        tabelaParametro.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        tabelaParametro.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tabelaParametroMouseClicked(evt);
            }
        });
        jScrollPane2.setViewportView(tabelaParametro);
        tabelaParametro.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("tabelaParametro.columnModel.title0")); // NOI18N
        tabelaParametro.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("tabelaParametro.columnModel.title1")); // NOI18N
        tabelaParametro.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("tabelaParametro.columnModel.title3")); // NOI18N
        tabelaParametro.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("tabelaParametro.columnModel.title2")); // NOI18N

        jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
        jLabel4.setName("jLabel4"); // NOI18N

        jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
        jLabel5.setName("jLabel5"); // NOI18N

        txtNomeParametro.setName("txtNomeParametro"); // NOI18N

        jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
        jLabel6.setName("jLabel6"); // NOI18N

        txtValorParametro.setName("txtValorParametro"); // NOI18N

        btnOKParametro.setText(resourceMap.getString("btnOKParametro.text")); // NOI18N
        btnOKParametro.setName("btnOKParametro"); // NOI18N
        btnOKParametro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnOKParametroActionPerformed(evt);
            }
        });

        jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N
        jLabel7.setName("jLabel7"); // NOI18N

        jLabel8.setText(resourceMap.getString("jLabel8.text")); // NOI18N
        jLabel8.setName("jLabel8"); // NOI18N

        txtNomeVariavel.setName("txtNomeVariavel"); // NOI18N

        jLabel9.setText(resourceMap.getString("jLabel9.text")); // NOI18N
        jLabel9.setName("jLabel9"); // NOI18N

        txtLimiteMinimoVariavel.setName("txtLimiteMinimoVariavel"); // NOI18N

        jLabel10.setText(resourceMap.getString("jLabel10.text")); // NOI18N
        jLabel10.setName("jLabel10"); // NOI18N

        txtLimiteMaximoVariavel.setName("txtLimiteMaximoVariavel"); // NOI18N

        cmbTagOPCVariavel.setName("cmbTagOPCVariavel"); // NOI18N

        btnOKVariavel.setText(resourceMap.getString("btnOKVariavel.text")); // NOI18N
        btnOKVariavel.setName("btnOKVariavel"); // NOI18N
        btnOKVariavel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnOKVariavelActionPerformed(evt);
            }
        });

        jScrollPane4.setName("jScrollPane4"); // NOI18N

        tabelaVariavel.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Nome", "Tag OPC", "Mínimo", "Máximo", "Esc. Conversão", "Unid. Engenharia", "Atualizar", "Remover"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, false, false, true, true
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tabelaVariavel.setName("tabelaVariavel"); // NOI18N
        tabelaVariavel.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        tabelaVariavel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tabelaVariavelMouseClicked(evt);
            }
        });
        jScrollPane4.setViewportView(tabelaVariavel);
        tabelaVariavel.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("tabelaVariavel.columnModel.title0")); // NOI18N
        tabelaVariavel.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("tabelaVariavel.columnModel.title3")); // NOI18N
        tabelaVariavel.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("tabelaVariavel.columnModel.title2")); // NOI18N
        tabelaVariavel.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("tabelaVariavel.columnModel.title1")); // NOI18N
        tabelaVariavel.getColumnModel().getColumn(4).setHeaderValue(resourceMap.getString("tabelaVariavel.columnModel.title6")); // NOI18N
        tabelaVariavel.getColumnModel().getColumn(5).setHeaderValue(resourceMap.getString("tabelaVariavel.columnModel.title7")); // NOI18N
        tabelaVariavel.getColumnModel().getColumn(6).setHeaderValue(resourceMap.getString("tabelaVariavel.columnModel.title5")); // NOI18N
        tabelaVariavel.getColumnModel().getColumn(7).setHeaderValue(resourceMap.getString("tabelaVariavel.columnModel.title4")); // NOI18N

        btnOK.setText(resourceMap.getString("btnOK.text")); // NOI18N
        btnOK.setName("btnOK"); // NOI18N
        btnOK.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnOKActionPerformed(evt);
            }
        });

        btnCancelar.setText(resourceMap.getString("btnCancelar.text")); // NOI18N
        btnCancelar.setName("btnCancelar"); // NOI18N
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });

        jLabel11.setText(resourceMap.getString("jLabel11.text")); // NOI18N
        jLabel11.setName("jLabel11"); // NOI18N

        jLabel12.setText(resourceMap.getString("jLabel12.text")); // NOI18N
        jLabel12.setName("jLabel12"); // NOI18N

        jLabel13.setText(resourceMap.getString("jLabel13.text")); // NOI18N
        jLabel13.setName("jLabel13"); // NOI18N

        txtUnidadeEngenhariaVariavel.setText(resourceMap.getString("txtUnidadeEngenhariaVariavel.text")); // NOI18N
        txtUnidadeEngenhariaVariavel.setName("txtUnidadeEngenhariaVariavel"); // NOI18N

        txtEscalaConversaoVariavel.setText(resourceMap.getString("txtEscalaConversaoVariavel.text")); // NOI18N
        txtEscalaConversaoVariavel.setName("txtEscalaConversaoVariavel"); // NOI18N

        jLabel14.setText(resourceMap.getString("jLabel14.text")); // NOI18N
        jLabel14.setName("jLabel14"); // NOI18N

        txtArquivoAlgoritmo.setText(resourceMap.getString("txtArquivoAlgoritmo.text")); // NOI18N
        txtArquivoAlgoritmo.setName("txtArquivoAlgoritmo"); // NOI18N

        jButton1.setText(resourceMap.getString("jButton1.text")); // NOI18N
        jButton1.setName("jButton1"); // NOI18N
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(txtNome, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(txtPeriodoAmostragem)
                                .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jLabel14)
                            .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(txtValorEstadoSeguranca)
                            .addComponent(txtArquivoAlgoritmo))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 86, Short.MAX_VALUE))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 452, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel7)
                            .addGroup(jPanel3Layout.createSequentialGroup()
                                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(jPanel3Layout.createSequentialGroup()
                                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(jLabel9)
                                            .addComponent(jLabel10))
                                        .addGap(4, 4, 4)
                                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(txtNomeVariavel, javax.swing.GroupLayout.PREFERRED_SIZE, 129, javax.swing.GroupLayout.PREFERRED_SIZE)
                                            .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                                .addComponent(txtLimiteMaximoVariavel, javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(txtLimiteMinimoVariavel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE))))
                                    .addComponent(jLabel8))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jLabel11, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jLabel13, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jLabel12, javax.swing.GroupLayout.Alignment.TRAILING))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addGroup(jPanel3Layout.createSequentialGroup()
                                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                            .addComponent(txtEscalaConversaoVariavel, javax.swing.GroupLayout.Alignment.LEADING)
                                            .addComponent(txtUnidadeEngenhariaVariavel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(btnOKVariavel, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(cmbTagOPCVariavel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                            .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel4)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(jPanel3Layout.createSequentialGroup()
                                .addComponent(jLabel5)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(txtNomeParametro, javax.swing.GroupLayout.PREFERRED_SIZE, 167, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(jLabel6)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(txtValorParametro, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(btnOKParametro, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addGap(164, 164, 164)
                        .addComponent(btnOK)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCancelar)))
                .addContainerGap())
        );

        jPanel3Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {btnOKParametro, btnOKVariavel});

        jPanel3Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {txtNome, txtPeriodoAmostragem, txtValorEstadoSeguranca});

        jPanel3Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {txtEscalaConversaoVariavel, txtLimiteMaximoVariavel, txtLimiteMinimoVariavel, txtUnidadeEngenhariaVariavel});

        jPanel3Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {cmbTagOPCVariavel, txtNomeVariavel});

        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel14))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtArquivoAlgoritmo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtValorEstadoSeguranca, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtPeriodoAmostragem, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel4)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel5)
                    .addComponent(txtNomeParametro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6)
                    .addComponent(txtValorParametro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnOKParametro))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel7)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel8)
                    .addComponent(txtNomeVariavel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel11)
                    .addComponent(cmbTagOPCVariavel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel9)
                    .addComponent(txtLimiteMinimoVariavel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel13)
                    .addComponent(txtEscalaConversaoVariavel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel10)
                        .addComponent(txtLimiteMaximoVariavel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(txtUnidadeEngenhariaVariavel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btnOKVariavel))
                    .addComponent(jLabel12))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnOK)
                    .addComponent(btnCancelar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout janelaEdicaoLayout = new javax.swing.GroupLayout(janelaEdicao.getContentPane());
        janelaEdicao.getContentPane().setLayout(janelaEdicaoLayout);
        janelaEdicaoLayout.setHorizontalGroup(
            janelaEdicaoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        janelaEdicaoLayout.setVerticalGroup(
            janelaEdicaoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        fcArquivoAlgoritmo.setDialogTitle(resourceMap.getString("fcArquivoAlgoritmo.dialogTitle")); // NOI18N
        fcArquivoAlgoritmo.setName("fcArquivoAlgoritmo"); // NOI18N

        setName("Form"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        tabela.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Nome", "Período de Amostragem", "Estado de Segurança", "Atualizar", "Remover"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, false, true, true
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tabela.setName("tabela"); // NOI18N
        tabela.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        tabela.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tabelaMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(tabela);
        tabela.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("tabela.columnModel.title0")); // NOI18N
        tabela.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("tabela.columnModel.title1")); // NOI18N
        tabela.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("tabela.columnModel.title2")); // NOI18N
        tabela.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("tabela.columnModel.title3")); // NOI18N
        tabela.getColumnModel().getColumn(4).setHeaderValue(resourceMap.getString("tabela.columnModel.title4")); // NOI18N
        tabela.getColumnModel().getColumn(5).setHeaderValue(resourceMap.getString("tabela.columnModel.title5")); // NOI18N

        jPanel1.setName("jPanel1"); // NOI18N

        btnInserir.setText(resourceMap.getString("btnInserir.text")); // NOI18N
        btnInserir.setName("btnInserir"); // NOI18N
        btnInserir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnInserirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(152, 152, 152)
                .addComponent(btnInserir)
                .addContainerGap(157, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(btnInserir)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 249, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void tabelaMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tabelaMouseClicked
        // TODO add your handling code here:
        if (getTabela().getSelectedColumn() == COLUNA_ATUALIZAR_TABELA) {
            atualizar();
        } else if (getTabela().getSelectedColumn() == COLUNA_REMOVER_TABELA) {
            remover();
        }
}//GEN-LAST:event_tabelaMouseClicked

    private void btnInserirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnInserirActionPerformed
        // TODO add your handling code here:
        processarAcaoBotaoInserir();
}//GEN-LAST:event_btnInserirActionPerformed

    private void btnOKParametroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKParametroActionPerformed
        // TODO add your handling code here:
        processarAcaoBotaoOKParametro();
}//GEN-LAST:event_btnOKParametroActionPerformed

    private void tabelaParametroMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tabelaParametroMouseClicked
        // TODO add your handling code here:
        if (tabelaParametro.getSelectedColumn() == COLUNA_ATUALIZAR_TABELA_PARAMETRO) {
            atualizarParametro();
        } else if (tabelaParametro.getSelectedColumn() == COLUNA_REMOVER_TABELA_PARAMETRO) {
            removerParametro();
        }
    }//GEN-LAST:event_tabelaParametroMouseClicked

    private void tabelaVariavelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tabelaVariavelMouseClicked
        // TODO add your handling code here:
        if (tabelaVariavel.getSelectedColumn() == COLUNA_ATUALIZAR_TABELA_VARIAVEL) {
            atualizarVariavel();
        } else if (tabelaVariavel.getSelectedColumn() == COLUNA_REMOVER_TABELA_VARIAVEL) {
            removerVariavel();
        }
    }//GEN-LAST:event_tabelaVariavelMouseClicked

    private void btnOKVariavelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKVariavelActionPerformed
        // TODO add your handling code here:
        processarAcaoBotaoOKVariavel();
    }//GEN-LAST:event_btnOKVariavelActionPerformed

    private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKActionPerformed
        // TODO add your handling code here:
        processarAcaoBotaoOK();
    }//GEN-LAST:event_btnOKActionPerformed

    private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed
        // TODO add your handling code here:
        processarAcaoBotaoCancelar();
    }//GEN-LAST:event_btnCancelarActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:
        if (fcArquivoAlgoritmo.showDialog(janelaEdicao, "OK") == JFileChooser.APPROVE_OPTION) {
            File arquivoAlgoritmo = fcArquivoAlgoritmo.getSelectedFile();

            txtArquivoAlgoritmo.setText(arquivoAlgoritmo.getAbsolutePath());
        }
    }//GEN-LAST:event_jButton1ActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnInserir;
    private javax.swing.JButton btnOK;
    private javax.swing.JButton btnOKParametro;
    private javax.swing.JButton btnOKVariavel;
    private javax.swing.JComboBox cmbTagOPCVariavel;
    private javax.swing.JFileChooser fcArquivoAlgoritmo;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JDialog janelaEdicao;
    private javax.swing.JTable tabela;
    private javax.swing.JTable tabelaParametro;
    private javax.swing.JTable tabelaVariavel;
    private javax.swing.JTextField txtArquivoAlgoritmo;
    private javax.swing.JTextField txtEscalaConversaoVariavel;
    private javax.swing.JTextField txtLimiteMaximoVariavel;
    private javax.swing.JTextField txtLimiteMinimoVariavel;
    private javax.swing.JTextField txtNome;
    private javax.swing.JTextField txtNomeParametro;
    private javax.swing.JTextField txtNomeVariavel;
    private javax.swing.JTextField txtPeriodoAmostragem;
    private javax.swing.JTextField txtUnidadeEngenhariaVariavel;
    private javax.swing.JTextField txtValorEstadoSeguranca;
    private javax.swing.JTextField txtValorParametro;
    // End of variables declaration//GEN-END:variables

    @Override
    protected ICadastroController getController() {
        return controller;
    }

    @Override
    protected JDialog getJanelaEdicao() {
        return janelaEdicao;
    }

    @Override
    protected JTable getTabela() {
        return tabela;
    }

    @Override
    protected void setTextoBotaoOK(String texto) {
        btnOK.setText(texto);
    }

    @Override
    protected void limparJanelaEdicao() {
        txtNome.setText("");
        txtPeriodoAmostragem.setText("");
        txtValorParametro.setText("");
        txtArquivoAlgoritmo.setText("");

        parametros = new ArrayList<ParametroConfiguracao>();
        variaveis = new ArrayList<VariavelControlador>();

        if (operacaoAtual == Operacao.ATUALIZAR) {
            parametros.addAll(controller.sincronizarParametros(entidade));
            variaveis.addAll(controller.sincronizarVariaveis(entidade));
        }

        for (int i=tabelaParametro.getRowCount() - 1; i >= 0; i--) {
            ((DefaultTableModel)tabelaParametro.getModel()).removeRow(i);

            ((DefaultTableModel)tabelaParametro.getModel()).fireTableRowsDeleted(i, i);
        }
        for (int i=tabelaVariavel.getRowCount() - 1; i >= 0; i--) {
            ((DefaultTableModel)tabelaVariavel.getModel()).removeRow(i);

            ((DefaultTableModel)tabelaVariavel.getModel()).fireTableRowsDeleted(i, i);
        }

        limparJanelaEdicaoParametro();
        limparJanelaEdicaoVariavel();
    }

    @Override
    protected void preencherJanelaEdicao() {
        txtNome.setText(entidade.getNome());
        txtPeriodoAmostragem.setText("" + entidade.getPeriodoAmostragem());
        txtValorEstadoSeguranca.setText("" + entidade.getValorEstadoSeguranca());

        preencherTabelaParametro();
        preencherTabelaVariavel();
    }

    @Override
    protected void preencherTabela() {
        try {
            List<Controlador> controladores = controller.listar();

            for (Controlador c : controladores) {
                atualizarTabela(c, Operacao.INSERIR);
            }
        } catch (Exception ex) {
            //mostrarErro("Não foi possível inserir/atualizar registro da tabela.");
        }
    }

    @Override
    protected void preencherEntidade() {
        entidade.setNome(txtNome.getText());
        entidade.setPeriodoAmostragem(Float.parseFloat(txtPeriodoAmostragem.getText()));
        entidade.setValorEstadoSeguranca(Double.parseDouble(txtValorEstadoSeguranca.getText()));
        entidade.setServidorOPC(controller.sincronizarServidorOPC(Dados.servidorOPC));

        if (fcArquivoAlgoritmo.getSelectedFile() != null) {
            File arquivoAlgoritmo = fcArquivoAlgoritmo.getSelectedFile();

            entidade.setArquivoAlgoritmo(arquivoAlgoritmo.getAbsolutePath());
            entidade.setClasseAlgoritmo(arquivoAlgoritmo.getName().substring(0, arquivoAlgoritmo.getName().lastIndexOf(".")));
        }

        for (ParametroConfiguracao parametro : parametros) {
            parametro.setControlador(entidade);
        }

        for (VariavelControlador variavel : variaveis) {
            variavel.setControlador(entidade);
        }

        entidade.setParametrosConfiguracao(parametros);
        entidade.setVariaveisControlador(variaveis);
    }

    @Override
    protected String getDescricaoEntidade() {
        return "Controlador";
    }

    @Override
    protected Object[] getLinhaDados(Controlador entidade) {
        return new Object[] {
            entidade.getId(),
            entidade.getNome(),
            entidade.getPeriodoAmostragem(),
            entidade.getValorEstadoSeguranca(),
            "A",
            "R"
        };
    }

    private void listarTagsOPC() {
        try {
            ((DefaultComboBoxModel) cmbTagOPCVariavel.getModel()).removeAllElements();

            for (TagOPC tagOPC : controller.listarTagsOPC()) {
                cmbTagOPCVariavel.addItem(tagOPC);
            }
        } catch (VisaoException vex) {
            //((JanelaPrincipal)this.getParent()).abrirJanelaServidorOPC();
        }
    }

    private void atualizarParametro() {
        limparJanelaEdicaoParametro();

        entidadeParametro = parametros.get(tabelaParametro.getSelectedRow());

        operacaoAtualParametro = Operacao.ATUALIZAR;

        if (operacaoAtualParametro == Operacao.INSERIR) {
            btnOKParametro.setText("Inserir");
        } else if (operacaoAtualParametro == Operacao.ATUALIZAR) {
            btnOKParametro.setText("Atualizar");

            preencherJanelaEdicaoParametro();
        }
    }

    private void removerParametro() {
        try {
            operacaoAtualParametro = Operacao.REMOVER;

            if (Confirmar(janelaEdicao, "Tem certeza que deseja excluir este registro?") == JOptionPane.OK_OPTION) {
                parametros.remove(tabelaParametro.getSelectedRow());

                atualizarTabelaParametro(null);

                limparJanelaEdicaoParametro();

                if (tabelaParametro.getRowCount() > 0) {
                    tabelaParametro.getSelectionModel().setSelectionInterval(0, 0);
                }
            }
        } catch (Exception ex) {
            //mostrarErro("Não foi possível remover registro da tabela.");
        }
    }

    private void atualizarVariavel() {
        limparJanelaEdicaoVariavel();

        entidadeVariavel = variaveis.get(tabelaVariavel.getSelectedRow());

        operacaoAtualVariavel = Operacao.ATUALIZAR;

        if (operacaoAtualVariavel == Operacao.INSERIR) {
            btnOKVariavel.setText("Inserir");
        } else if (operacaoAtualVariavel == Operacao.ATUALIZAR) {
            btnOKVariavel.setText("Atualizar");

            preencherJanelaEdicaoVariavel();
        }
    }

    private void removerVariavel() {
        try {
            operacaoAtualVariavel = Operacao.REMOVER;

            if (Confirmar(janelaEdicao, "Tem certeza que deseja excluir este registro?") == JOptionPane.OK_OPTION) {
                variaveis.remove(tabelaVariavel.getSelectedRow());

                atualizarTabelaVariavel(null);

                limparJanelaEdicaoVariavel();

                if (tabelaVariavel.getRowCount() > 0) {
                    tabelaVariavel.getSelectionModel().setSelectionInterval(0, 0);
                }
            }
        } catch (Exception ex) {
            //mostrarErro("Não foi possível remover registro da tabela.");
        }
    }

    private void processarAcaoBotaoOKParametro() {
        try {
            if (operacaoAtualParametro == Operacao.INSERIR) {
                entidadeParametro = new ParametroConfiguracao();

                preencherEntidadeParametro();

                parametros.add(entidadeParametro);
            } else if (operacaoAtualParametro == Operacao.ATUALIZAR) {
                preencherEntidadeParametro();

                parametros.set(parametros.indexOf(entidadeParametro), entidadeParametro);
            }

            atualizarTabelaParametro(entidadeParametro);

            limparJanelaEdicaoParametro();
        } catch (Exception ex) {
            ex.printStackTrace();
            //mostrarErro("Não foi possível inserir/atualizar registro da tabela.");
        }
    }

    private void processarAcaoBotaoOKVariavel() {
        try {
            if (operacaoAtualVariavel == Operacao.INSERIR) {
                entidadeVariavel = new VariavelControlador();

                preencherEntidadeVariavel();

                variaveis.add(entidadeVariavel);
            } else if (operacaoAtualVariavel == Operacao.ATUALIZAR) {
                preencherEntidadeVariavel();

                variaveis.set(variaveis.indexOf(entidadeVariavel), entidadeVariavel);
            }

            atualizarTabelaVariavel(entidadeVariavel);

            limparJanelaEdicaoVariavel();
        } catch (Exception ex) {
            ex.printStackTrace();
            //mostrarErro("Não foi possível inserir/atualizar registro da tabela.");
        }
    }

    private void limparJanelaEdicaoParametro() {
        operacaoAtualParametro = Operacao.INSERIR;

        btnOKParametro.setText("Inserir");

        entidadeParametro = null;

        txtNomeParametro.setText("");
        txtValorParametro.setText("");
    }

    private void limparJanelaEdicaoVariavel() {
        operacaoAtualVariavel = Operacao.INSERIR;

        btnOKVariavel.setText("Inserir");

        entidadeVariavel = null;

        txtNomeVariavel.setText("");
        txtLimiteMinimoVariavel.setText("");
        txtLimiteMaximoVariavel.setText("");
        txtEscalaConversaoVariavel.setText("");
        txtUnidadeEngenhariaVariavel.setText("");
        cmbTagOPCVariavel.setSelectedIndex(0);
    }

    private void preencherTabelaParametro() {
        try {
            for (ParametroConfiguracao parametro : parametros) {
                ((DefaultTableModel)tabelaParametro.getModel()).addRow(this.getLinhaDadosParametro(parametro));

                ((DefaultTableModel)tabelaParametro.getModel()).fireTableRowsInserted(tabelaParametro.getRowCount(), tabelaParametro.getRowCount());
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            //mostrarErro("Não foi possível inserir/atualizar registro da tabela.");
        }
    }

    private void preencherTabelaVariavel() {
        try {
            for (VariavelControlador variavel : variaveis) {
                ((DefaultTableModel)tabelaVariavel.getModel()).addRow(this.getLinhaDadosVariavel(variavel));

                ((DefaultTableModel)tabelaVariavel.getModel()).fireTableRowsInserted(tabelaVariavel.getRowCount(), tabelaVariavel.getRowCount());
            }
        } catch (Exception ex) {
            //mostrarErro("Não foi possível inserir/atualizar registro da tabela.");
        }
    }

    protected Object[] getLinhaDadosParametro(ParametroConfiguracao parametro){
        return new Object[] {
            parametro.getNome(),
            parametro.getValor(),
            "A",
            "R"
        };
    }

    protected Object[] getLinhaDadosVariavel(VariavelControlador variavel){
        return new Object[] {
            variavel.getNome(),
            variavel.getTagOPC().getNome(),
            variavel.getLimiteMinimo(),
            variavel.getLimiteMaximo(),
            variavel.getEscalaConversao(),
            variavel.getUnidadeEngenharia(),
            "A",
            "R"
        };
    }

    private void preencherJanelaEdicaoParametro() {
        txtNomeParametro.setText(entidadeParametro.getNome());
        txtValorParametro.setText("" + entidadeParametro.getValor());
    }

    private void preencherJanelaEdicaoVariavel() {
        txtNomeVariavel.setText(entidadeVariavel.getNome());
        txtLimiteMinimoVariavel.setText("" + entidadeVariavel.getLimiteMinimo());
        txtLimiteMaximoVariavel.setText("" + entidadeVariavel.getLimiteMaximo());
        txtEscalaConversaoVariavel.setText("" + entidadeVariavel.getEscalaConversao());
        txtUnidadeEngenhariaVariavel.setText(entidadeVariavel.getUnidadeEngenharia());
        cmbTagOPCVariavel.setSelectedItem(entidadeVariavel.getTagOPC());
    }

    private void atualizarTabelaParametro(ParametroConfiguracao entidadeParametro) throws Exception {
        switch (operacaoAtualParametro) {
            case INSERIR: {
                    ((DefaultTableModel)tabelaParametro.getModel()).addRow(this.getLinhaDadosParametro(entidadeParametro));

                    ((DefaultTableModel)tabelaParametro.getModel()).fireTableRowsInserted(tabelaParametro.getRowCount(), tabelaParametro.getRowCount());
                }
                break;
            case ATUALIZAR: {
                    int linhaSelecionada = tabelaParametro.getSelectedRow();

                    ((DefaultTableModel)tabelaParametro.getModel()).removeRow(linhaSelecionada);
                    ((DefaultTableModel)tabelaParametro.getModel()).insertRow(linhaSelecionada, this.getLinhaDadosParametro(entidadeParametro));

                    ((DefaultTableModel)tabelaParametro.getModel()).fireTableRowsUpdated(linhaSelecionada, linhaSelecionada);
                }
                break;
            case REMOVER: {
                    int linhaSelecionada = tabelaParametro.getSelectedRow();

                    ((DefaultTableModel)tabelaParametro.getModel()).removeRow(linhaSelecionada);

                    ((DefaultTableModel)tabelaParametro.getModel()).fireTableRowsDeleted(linhaSelecionada, linhaSelecionada);
                }
                break;
            default:
                throw new Exception("Tipo de operação inválida.");
        }
    }

    private void atualizarTabelaVariavel(VariavelControlador entidadeVariavel) throws Exception {
        switch (operacaoAtualVariavel) {
            case INSERIR: {
                    ((DefaultTableModel)tabelaVariavel.getModel()).addRow(this.getLinhaDadosVariavel(entidadeVariavel));

                    ((DefaultTableModel)tabelaVariavel.getModel()).fireTableRowsInserted(tabelaVariavel.getRowCount(), tabelaVariavel.getRowCount());
                }
                break;
            case ATUALIZAR: {
                    int linhaSelecionada = tabelaVariavel.getSelectedRow();

                    ((DefaultTableModel)tabelaVariavel.getModel()).removeRow(linhaSelecionada);
                    ((DefaultTableModel)tabelaVariavel.getModel()).insertRow(linhaSelecionada, this.getLinhaDadosVariavel(entidadeVariavel));

                    ((DefaultTableModel)tabelaVariavel.getModel()).fireTableRowsUpdated(linhaSelecionada, linhaSelecionada);
                }
                break;
            case REMOVER: {
                    int linhaSelecionada = tabelaVariavel.getSelectedRow();

                    ((DefaultTableModel)tabelaVariavel.getModel()).removeRow(linhaSelecionada);

                    ((DefaultTableModel)tabelaVariavel.getModel()).fireTableRowsDeleted(linhaSelecionada, linhaSelecionada);
                }
                break;
            default:
                throw new Exception("Tipo de operação inválida.");
        }
    }

    private void preencherEntidadeParametro() {
        entidadeParametro.setNome(txtNomeParametro.getText());
        entidadeParametro.setValor(Double.parseDouble(txtValorParametro.getText()));
    }

    private void preencherEntidadeVariavel() {
        entidadeVariavel.setNome(txtNomeVariavel.getText());
        entidadeVariavel.setLimiteMinimo(Double.parseDouble(txtLimiteMinimoVariavel.getText()));
        entidadeVariavel.setLimiteMaximo(Double.parseDouble(txtLimiteMaximoVariavel.getText()));
        entidadeVariavel.setEscalaConversao(Double.parseDouble(txtEscalaConversaoVariavel.getText()));
        entidadeVariavel.setUnidadeEngenharia(txtUnidadeEngenhariaVariavel.getText());
        entidadeVariavel.setTagOPC((TagOPC)cmbTagOPCVariavel.getSelectedItem());
    }

    protected void adicionarBotoesTabela() {
        ButtonColumn bcAtualizar = new ButtonColumn(getTabela(), COLUNA_ATUALIZAR_TABELA);
        ButtonColumn bcRemover = new ButtonColumn(getTabela(), COLUNA_REMOVER_TABELA);

        ButtonColumn bcAtualizarParametro = new ButtonColumn(tabelaParametro, COLUNA_ATUALIZAR_TABELA_PARAMETRO);
        ButtonColumn bcRemoverParametro = new ButtonColumn(tabelaParametro, COLUNA_REMOVER_TABELA_PARAMETRO);

        ButtonColumn bcAtualizarVariavel = new ButtonColumn(tabelaVariavel, COLUNA_ATUALIZAR_TABELA_VARIAVEL);
        ButtonColumn bcRemoverVariavel = new ButtonColumn(tabelaVariavel, COLUNA_REMOVER_TABELA_VARIAVEL);
    }
}
